package tecnicas;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Comparator;

import matriz.Matriz;
import datosFamilias.*;

public class AHP extends TecnicaAbstracta implements Comparator
{
    // Almacena las matrices dependiendo de los criterios
    private ArrayList<Matriz> matricesCriterios;
    private ArrayList<Familia> familias;
    
    public AHP(ArrayList<String> valoresMatriz, ArrayList<Familia> fam, int numTecnica, int cantCriterios)
    {
       familias = fam;
       numeroDeTecnica = numTecnica;
       cantidadDeCriterios = cantCriterios;
       
       cargarPriorizacionCriterios(valoresMatriz, cantidadDeCriterios);
       
       matricesCriterios = new ArrayList<Matriz>();
       for(int index = 0; index < cantidadDeCriterios; index++)
       {
           RelacionPorCriterio rel = new RelacionPorCriterio(index);
           Matriz criterio = rel.obtenerRelacionPorCriterio(familias);
           matricesCriterios.add(criterio);
       }
    }
    
    @Override
    public ArrayList<Familia> calcularResultados() 
    {
        for(int index = 0; index < matricesCriterios.size(); index++)
        {
            ArrayList<Float> vectorDeCriterios = (matricesCriterios.get(index)).obtenerVectorPrioridad();
            for(int i = 0; i < vectorDeCriterios.size(); i++)
            {
                Familia famActual = familias.get(i);
                famActual.agregarPuntaje(numeroDeTecnica, index, priorizacionCriterios.get(index) * vectorDeCriterios.get(i));
            }
        }
        ArrayList<Familia> famOrd = (ArrayList)familias.clone();
        Collections.sort(famOrd, this);
        return famOrd;
    } 
    
    @Override
    public int compare(Object o1, Object o2) 
    {
        float fam1 = 0;
        float fam2 = 0;
        for(int index = 0; index < cantidadDeCriterios; index++)
        {
            fam1 += ((Familia)o1).obtenerPuntaje(numeroDeTecnica, index);
            fam2 += ((Familia)o2).obtenerPuntaje(numeroDeTecnica, index);
        }
        if(fam1-fam2 > 0)
        {
            return -1;
        }
        else
        {
            if(fam1-fam2 < 0)
            {
                return 1;
            }
        }
        return 0;
    }
}